From 71a78c9e540081093fa388d41c2812bd0d9967cc Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Thu, 8 Feb 2018 15:58:11 +0000 Subject: [PATCH] minor fixes and added method to update only the status of a record git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-catalogue/grsf-publisher-ws@163067 82a268e6-3cf1-43bd-a215-b396298e98cf --- .settings/org.eclipse.wst.common.component | 3 + .../json/input/others/UpdateRecordStatus.java | 58 +++++++++++++++ .../services/GrsfPublisherFisheryService.java | 70 ++++++++++++++++++ .../services/GrsfPublisherStockService.java | 72 ++++++++++++++++++- .../utils/CommonServiceUtils.java | 2 +- .../grsf_publish_ws/utils/HelperMethods.java | 2 +- 6 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/others/UpdateRecordStatus.java diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 671fd1c..ca401f8 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -6,6 +6,9 @@ uses + + uses + diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/others/UpdateRecordStatus.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/others/UpdateRecordStatus.java new file mode 100644 index 0000000..d4fe30d --- /dev/null +++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/others/UpdateRecordStatus.java @@ -0,0 +1,58 @@ +package org.gcube.data_catalogue.grsf_publish_ws.json.input.others; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.gcube.datacatalogue.common.Constants; +import org.gcube.datacatalogue.common.enums.Status; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UpdateRecordStatus { + + @JsonProperty(Constants.KB_ID) + @NotNull(message= Constants.KB_ID + " cannot be null") + @Size(min=1, message= Constants.KB_ID + " cannot be empty") + private String uuid; + + @JsonProperty(Constants.NEW_STATUS) + private Status newStatus; + + public UpdateRecordStatus() { + super(); + } + + /** + * @param uuid + * @param newStatus + */ + public UpdateRecordStatus(String uuid, Status newStatus) { + super(); + this.uuid = uuid; + this.newStatus = newStatus; + } + + public Status getNewStatus() { + return newStatus; + } + + public void setNewStatus(Status newStatus) { + this.newStatus = newStatus; + } + + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "UpdateRecordStatus [uuid=" + uuid + ", newStatus=" + newStatus + + "]"; + } + +} diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java index 334bc9d..354fe43 100644 --- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java +++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java @@ -30,6 +30,7 @@ import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.data_catalogue.grsf_publish_ws.json.input.others.DeleteRecord; +import org.gcube.data_catalogue.grsf_publish_ws.json.input.others.UpdateRecordStatus; import org.gcube.data_catalogue.grsf_publish_ws.json.input.record.FisheryRecord; import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseBean; import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseCreationBean; @@ -546,4 +547,73 @@ public class GrsfPublisherFisheryService { } return Response.status(status).entity(responseBean).build(); } + + @POST + @Path("update-status") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response updateStatusStock( + @Valid UpdateRecordStatus bean, + @PathParam("source") String source) + throws ValidationException{ + + + Caller caller = AuthorizationProvider.instance.get(); + String username = caller.getClient().getId(); + String context = ScopeProvider.instance.get(); + + logger.info("Incoming request for updating a status of record = " + bean + ". Request comes from user " + username + " in context " + context); + + ResponseCreationBean responseBean = new ResponseCreationBean(); + Status status = Status.INTERNAL_SERVER_ERROR; + + try{ + + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); + + if(catalogue == null){ + throw new Exception("There was a problem while serving your request. No catalogue instance was found in this context!"); + }else{ + + // catalog id must be reported + String uuid = bean.getUuid(); + String newStatus = bean.getNewStatus().getOrigName(); + + // get the dataset + String apiKeyUser = catalogue.getApiKeyFromUsername(username); + CkanDataset record = catalogue.getDataset(uuid, apiKeyUser); + + if(record == null) + throw new Exception("A record with knowledge_base_id id " + uuid + " does not exist!"); + + // check system type + boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY).equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE); + + if(!isGRSF) + throw new Exception("You are trying to modify a Legacy record!"); + + boolean rightDomain = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).equalsIgnoreCase(Product_Type.FISHERY.getOrigName()); + + if(!rightDomain) + throw new Exception("This is not a Fishery record!"); + + // update it + Map> updateStatus = new HashMap>(1); + updateStatus.put(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY, Arrays.asList(newStatus)); + catalogue.patchProductCustomFields(uuid, apiKeyUser, updateStatus, true); + status = Status.OK; + responseBean.setError(null); + responseBean.setKbUuid(uuid); + responseBean.setId(record.getId()); + responseBean.setItemUrl(record.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD)); + + } + }catch(Exception e){ + logger.error("Failed to update fishery record's status", e); + responseBean.setError(e.getMessage()); + } + + return Response.status(status).entity(responseBean).build(); + + } } \ No newline at end of file diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java index 8764ec0..b6ba42b 100644 --- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java +++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java @@ -30,6 +30,7 @@ import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.data_catalogue.grsf_publish_ws.json.input.others.DeleteRecord; +import org.gcube.data_catalogue.grsf_publish_ws.json.input.others.UpdateRecordStatus; import org.gcube.data_catalogue.grsf_publish_ws.json.input.record.StockRecord; import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseBean; import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseCreationBean; @@ -425,7 +426,7 @@ public class GrsfPublisherStockService { CkanDataset recordPublished = catalogue.getDataset(catalogId, apiKey); if(recordPublished == null) - throw new Exception("A record with catalogue id " + catalogId + " does not exist!"); + throw new Exception("A record with id " + catalogId + " does not exist!"); // retrieve the user's email and fullname String authorMail = HelperMethods.getUserEmail(context, token); @@ -544,4 +545,73 @@ public class GrsfPublisherStockService { return Response.status(status).entity(responseBean).build(); } + @POST + @Path("update-status") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response updateStatusStock( + @Valid UpdateRecordStatus bean, + @PathParam("source") String source) + throws ValidationException{ + + + Caller caller = AuthorizationProvider.instance.get(); + String username = caller.getClient().getId(); + String context = ScopeProvider.instance.get(); + + logger.info("Incoming request for updating a status of record = " + bean + ". Request comes from user " + username + " in context " + context); + + Status status = Status.INTERNAL_SERVER_ERROR; + + ResponseCreationBean responseBean = new ResponseCreationBean(); + + try{ + + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); + + if(catalogue == null){ + throw new Exception("There was a problem while serving your request. No catalogue instance was found in this context!"); + }else{ + + // catalog id must be reported + String uuid = bean.getUuid(); + String newStatus = bean.getNewStatus().getOrigName(); + + // get the dataset + String apiKeyUser = catalogue.getApiKeyFromUsername(username); + CkanDataset record = catalogue.getDataset(uuid, apiKeyUser); + + if(record == null) + throw new Exception("A record with knowledge_base_id id " + uuid + " does not exist!"); + + // check system type + boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY).equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE); + + if(!isGRSF) + throw new Exception("You are trying to modify a Legacy record!"); + + boolean rightDomain = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).equals(Product_Type.STOCK.getOrigName()); + + if(!rightDomain) + throw new Exception("This is not a Stock record!"); + + // update it + Map> updateStatus = new HashMap>(1); + updateStatus.put(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY, Arrays.asList(newStatus)); + catalogue.patchProductCustomFields(uuid, apiKeyUser, updateStatus, true); + status = Status.OK; + responseBean.setError(null); + responseBean.setKbUuid(uuid); + responseBean.setId(record.getId()); + responseBean.setItemUrl(record.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD)); + } + }catch(Exception e){ + logger.error("Failed to update stock record's status", e); + responseBean.setError(e.getMessage()); + } + + return Response.status(status).entity(responseBean).build(); + + } + } \ No newline at end of file diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/CommonServiceUtils.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/CommonServiceUtils.java index 8a6b02b..12f55ca 100644 --- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/CommonServiceUtils.java +++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/CommonServiceUtils.java @@ -552,7 +552,7 @@ public class CommonServiceUtils { Map> addField = new HashMap>(); String modifiedUUIDKey = namespaces.containsKey(Constants.ITEM_URL_FIELD) ? namespaces.get(Constants.ITEM_URL_FIELD) : Constants.ITEM_URL_FIELD; addField.put(modifiedUUIDKey, Arrays.asList(itemUrl)); - catalogue.patchProductCustomFields(datasetId, apiKey, addField); + catalogue.patchProductCustomFields(datasetId, apiKey, addField, false); } // update description anyway diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java index 2051ab4..2e167b1 100644 --- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java +++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java @@ -66,7 +66,7 @@ public abstract class HelperMethods { private static final org.slf4j.Logger logger = LoggerFactory.getLogger(HelperMethods.class); private static final String APPLICATION_ID_CATALOGUE_MANAGER = "org.gcube.datacatalogue.ProductCatalogue"; - private static final String NOTIFICATION_MESSAGE = "Dear members,
The item 'PRODUCT_TITLE' has been just published by USER_FULLNAME.
You can find it here: PRODUCT_URL
"; + private static final String NOTIFICATION_MESSAGE = "Dear members,
The record 'PRODUCT_TITLE' has been just published by USER_FULLNAME.
You can find it here: PRODUCT_URL
"; private static final String SOCIAL_SERVICE_APPLICATION_TOKEN = "/2/tokens/generate-application-token/"; private static final String SOCIAL_SERVICE_WRITE_APPLICATION_POST = "/2/posts/write-post-app/"; private static final String MEDIATYPE_JSON = "application/json";