diff --git a/pom.xml b/pom.xml index 1f8283b..cc0d897 100644 --- a/pom.xml +++ b/pom.xml @@ -135,19 +135,7 @@ 1.8 - - - - - - - - - - - - - + @@ -171,6 +159,19 @@ zulip-java-rest 1.0.0 + + + org.gcube.common + gcube-jackson-core + + + org.gcube.common + gcube-jackson-annotations + + + org.gcube.common + gcube-jackson-databind + diff --git a/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java b/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java index 8449b8d..cf342f8 100644 --- a/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java +++ b/src/main/java/org/gcube/gcat/moderation/thread/FakeModerationThread.java @@ -1,7 +1,7 @@ package org.gcube.gcat.moderation.thread; import org.gcube.common.authorization.utils.manager.SecretManager; -import org.gcube.gcat.api.CMItemStatus; +import org.gcube.gcat.api.moderation.CMItemStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/gcube/gcat/moderation/thread/ModerationThread.java b/src/main/java/org/gcube/gcat/moderation/thread/ModerationThread.java index 8884757..aecb5f4 100644 --- a/src/main/java/org/gcube/gcat/moderation/thread/ModerationThread.java +++ b/src/main/java/org/gcube/gcat/moderation/thread/ModerationThread.java @@ -1,7 +1,7 @@ package org.gcube.gcat.moderation.thread; import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; -import org.gcube.gcat.api.CMItemStatus; +import org.gcube.gcat.api.moderation.CMItemStatus; import org.gcube.gcat.persistence.ckan.CKANUser; /** diff --git a/src/main/java/org/gcube/gcat/moderation/thread/zulip/ZulipStream.java b/src/main/java/org/gcube/gcat/moderation/thread/zulip/ZulipStream.java index 9c0fd8c..5177103 100644 --- a/src/main/java/org/gcube/gcat/moderation/thread/zulip/ZulipStream.java +++ b/src/main/java/org/gcube/gcat/moderation/thread/zulip/ZulipStream.java @@ -8,8 +8,8 @@ import org.gcube.com.fasterxml.jackson.databind.JsonNode; import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.common.authorization.utils.manager.SecretManager; -import org.gcube.gcat.api.CMItemStatus; -import org.gcube.gcat.api.GCatConstants; +import org.gcube.gcat.api.moderation.CMItemStatus; +import org.gcube.gcat.api.moderation.Moderated; import org.gcube.gcat.moderation.thread.ModerationThread; import org.gcube.gcat.moderation.thread.zulip.ZulipResponse.Result; import org.gcube.gcat.social.SocialUsers; @@ -118,7 +118,7 @@ public class ZulipStream extends ModerationThread { principalsArrayNode.add(gCatZulipRestExecutor.httpController.getUserName()); // Going to add the catalogue moderators - Set moderators = SocialUsers.getUsernamesByRole(GCatConstants.CATALOGUE_MODERATOR); + Set moderators = SocialUsers.getUsernamesByRole(Moderated.CATALOGUE_MODERATOR); for(String moderator : moderators) { principalsArrayNode.add(moderator); } diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java index 2ae433c..5e83d98 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java @@ -24,11 +24,12 @@ import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.common.scope.impl.ScopeBean.Type; -import org.gcube.gcat.api.CMItemStatus; -import org.gcube.gcat.api.CMItemVisibility; import org.gcube.gcat.api.GCatConstants; -import org.gcube.gcat.api.Role; -import org.gcube.gcat.api.interfaces.Moderated; +import org.gcube.gcat.api.moderation.CMItemStatus; +import org.gcube.gcat.api.moderation.CMItemVisibility; +import org.gcube.gcat.api.moderation.Moderated; +import org.gcube.gcat.api.moderation.ModerationContent; +import org.gcube.gcat.api.roles.Role; import org.gcube.gcat.moderation.thread.ModerationThread; import org.gcube.gcat.oldutils.Validator; import org.gcube.gcat.profile.MetadataUtility; @@ -208,7 +209,7 @@ public class CKANPackage extends CKAN implements Moderated { JsonNode extra = extras.get(i); if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY)!=null && - extra.get(EXTRAS_KEY_KEY).asText().startsWith(GCatConstants.SYSTEM_CM_PREFIX)) { + extra.get(EXTRAS_KEY_KEY).asText().startsWith(Moderated.SYSTEM_CM_PREFIX)) { foundOne = true; }else { newExtras.add(extra.deepCopy()); @@ -822,7 +823,7 @@ public class CKANPackage extends CKAN implements Moderated { try { setApiKey(CKANUtility.getSysAdminAPI()); readItem(); - + if(ckanUser.getRole()!=Role.ADMIN && !isItemCreator()) { throw new ForbiddenException("Only " + Role.ADMIN.getPortalRole() + "s and item creator are entitled to purge an the item"); } @@ -866,7 +867,7 @@ public class CKANPackage extends CKAN implements Moderated { if(result.has(EXTRAS_KEY)) { ArrayNode extras = (ArrayNode) result.get(EXTRAS_KEY); for(JsonNode extra : extras) { - if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_STATUS) == 0) { + if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY).asText().compareTo(Moderated.SYSTEM_CM_ITEM_STATUS) == 0) { cmItemStatusString = extra.get(EXTRAS_VALUE_KEY).asText(); found = true; break; @@ -895,8 +896,8 @@ public class CKANPackage extends CKAN implements Moderated { CMItemStatus cmItemStatus = null; try { MultivaluedMap queryParameters = uriInfo.getQueryParameters(); - if(queryParameters.containsKey(GCatConstants.CM_ITEM_STATUS_QUERY_PARAMETER)) { - String cmItemStatusString = queryParameters.getFirst(GCatConstants.CM_ITEM_STATUS_QUERY_PARAMETER); + if(queryParameters.containsKey(Moderated.CM_ITEM_STATUS_QUERY_PARAMETER)) { + String cmItemStatusString = queryParameters.getFirst(Moderated.CM_ITEM_STATUS_QUERY_PARAMETER); cmItemStatus = CMItemStatus.getCMItemStatusFromValue(cmItemStatusString); } }catch (Exception e) { @@ -1094,12 +1095,12 @@ public class CKANPackage extends CKAN implements Moderated { } protected void setToRejected(JsonNode jsonNode) { - addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.REJECTED.getValue()); + addExtraField(jsonNode, Moderated.SYSTEM_CM_ITEM_STATUS, CMItemStatus.REJECTED.getValue()); } protected void setItemToPending(JsonNode jsonNode) { if(isModerationEnabled()) { - addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.PENDING.getValue()); + addExtraField(jsonNode, Moderated.SYSTEM_CM_ITEM_STATUS, CMItemStatus.PENDING.getValue()); CMItemVisibility cmItemVisibility = CMItemVisibility.PUBLIC; @@ -1109,7 +1110,7 @@ public class CKANPackage extends CKAN implements Moderated { cmItemVisibility = CMItemVisibility.RESTRICTED; } } - addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_VISIBILITY, cmItemVisibility.getValue()); + addExtraField(jsonNode, Moderated.SYSTEM_CM_ITEM_VISIBILITY, cmItemVisibility.getValue()); ((ObjectNode) jsonNode).put(PRIVATE_KEY, true); ((ObjectNode) jsonNode).put(SEARCHABLE_KEY, false); @@ -1123,23 +1124,23 @@ public class CKANPackage extends CKAN implements Moderated { CMItemVisibility cmItemVisibility = null; for(JsonNode extra : extras) { - if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY)!=null && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_STATUS) == 0) { + if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY)!=null && extra.get(EXTRAS_KEY_KEY).asText().compareTo(Moderated.SYSTEM_CM_ITEM_STATUS) == 0) { ((ObjectNode) extra).put(EXTRAS_VALUE_KEY, CMItemStatus.APPROVED.getValue()); approvedSet = true; } - if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY)!=null && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_VISIBILITY) == 0) { + if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY)!=null && extra.get(EXTRAS_KEY_KEY).asText().compareTo(Moderated.SYSTEM_CM_ITEM_VISIBILITY) == 0) { cmItemVisibility = CMItemVisibility.getCMItemStatusFromValue(extra.get(EXTRAS_VALUE_KEY).asText()); } } if(!approvedSet) { - addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.APPROVED.getValue()); + addExtraField(jsonNode, Moderated.SYSTEM_CM_ITEM_STATUS, CMItemStatus.APPROVED.getValue()); } if(cmItemVisibility==null) { cmItemVisibility = CMItemVisibility.PUBLIC; - addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_VISIBILITY, cmItemVisibility.getValue()); + addExtraField(jsonNode, Moderated.SYSTEM_CM_ITEM_VISIBILITY, cmItemVisibility.getValue()); } @@ -1252,9 +1253,6 @@ public class CKANPackage extends CKAN implements Moderated { default: break; } - - - return getAsCleanedString(result); } throw new MethodNotSupportedException("The reject operation is available only in moderation mode"); @@ -1279,7 +1277,7 @@ public class CKANPackage extends CKAN implements Moderated { if(!ckanUser.getPortalUser().isCatalogueModerator()) { // Users that are not if(!isItemCreator()) { - throw new NotAllowedException("Only item creator and " + GCatConstants.CATALOGUE_MODERATOR + "s are entitled to partecipate to the moderation discussion thread."); + throw new NotAllowedException("Only item creator and " + Moderated.CATALOGUE_MODERATOR + "s are entitled to partecipate to the moderation discussion thread."); } } @@ -1296,4 +1294,32 @@ public class CKANPackage extends CKAN implements Moderated { } } + public String moderate(String json) { + try { + ModerationContent moderationContent = mapper.readValue(json, ModerationContent.class); + String message = moderationContent.getMessage(); + if(moderationContent.getCMItemStatus() !=null) { + CMItemStatus cmItemStatus = moderationContent.getCMItemStatus(); + switch (cmItemStatus) { + case APPROVED: + return approve(message); + case REJECTED: + return reject(message); + default: + throw new BadRequestException("Allowed moderation operations are approve, reject and message"); + } + }else { + if(message==null || message.compareTo("")==0) { + throw new BadRequestException("Allowed moderation operations are approve, reject and message"); + } + message(message); + return null; + } + }catch(WebApplicationException e) { + throw e; + } catch(Exception e) { + throw new InternalServerErrorException(e); + } + } + } diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java index 0a113a0..892f07f 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java @@ -8,7 +8,7 @@ import javax.ws.rs.core.Response.Status; import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.common.authorization.utils.manager.SecretManager; -import org.gcube.gcat.api.Role; +import org.gcube.gcat.api.roles.Role; import org.gcube.gcat.social.PortalUser; import org.gcube.gcat.utils.RandomString; import org.slf4j.Logger; diff --git a/src/main/java/org/gcube/gcat/profile/ISProfile.java b/src/main/java/org/gcube/gcat/profile/ISProfile.java index 7076a5c..2a55f14 100644 --- a/src/main/java/org/gcube/gcat/profile/ISProfile.java +++ b/src/main/java/org/gcube/gcat/profile/ISProfile.java @@ -13,7 +13,7 @@ import org.gcube.common.resources.gcore.GenericResource; import org.gcube.common.resources.gcore.Resources; import org.gcube.datacatalogue.metadatadiscovery.reader.MetadataFormatDiscovery; import org.gcube.datacatalogue.metadatadiscovery.reader.QueryForResourceUtil; -import org.gcube.gcat.api.Role; +import org.gcube.gcat.api.roles.Role; import org.gcube.gcat.persistence.ckan.CKANUser; import org.gcube.gcat.persistence.ckan.CKANUserCache; import org.gcube.gcat.utils.Constants; diff --git a/src/main/java/org/gcube/gcat/profile/ResourceRegistryProfile.java b/src/main/java/org/gcube/gcat/profile/ResourceRegistryProfile.java index c95f721..2ee1de3 100644 --- a/src/main/java/org/gcube/gcat/profile/ResourceRegistryProfile.java +++ b/src/main/java/org/gcube/gcat/profile/ResourceRegistryProfile.java @@ -19,7 +19,7 @@ import org.gcube.common.resources.gcore.GenericResource; import org.gcube.common.resources.gcore.Resources; import org.gcube.datacatalogue.metadatadiscovery.reader.MetadataFormatDiscovery; import org.gcube.datacatalogue.metadatadiscovery.reader.QueryForResourceUtil; -import org.gcube.gcat.api.Role; +import org.gcube.gcat.api.roles.Role; import org.gcube.gcat.persistence.ckan.CKANUser; import org.gcube.gcat.persistence.ckan.CKANUserCache; import org.gcube.gcat.utils.Constants; diff --git a/src/main/java/org/gcube/gcat/rest/Item.java b/src/main/java/org/gcube/gcat/rest/Item.java index f98a805..19ca5a0 100644 --- a/src/main/java/org/gcube/gcat/rest/Item.java +++ b/src/main/java/org/gcube/gcat/rest/Item.java @@ -13,6 +13,8 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; import javax.xml.ws.WebServiceException; import org.gcube.gcat.ResourceInitializer; @@ -129,22 +131,20 @@ public class Item extends REST implements org.gcube.gcat.api.interf return delete(name, new Boolean(purge)); } - @Override - public String approve(String moderatorMessage) { - // TODO Auto-generated method stub - return null; - } - - @Override - public String reject(String moderatorMessage) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void message(String message) { - // TODO Auto-generated method stub - + @POST + @Path("/{" + ITEM_ID_PARAMETER + "}") + @Consumes(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8) + @Produces(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8) + public Response moderate(@PathParam(ITEM_ID_PARAMETER) String id, String json) { + setCalledMethod("POST /" + COLLECTION_PARAMETER + "/{" + ID_PARAMETER + "}"); + CKANPackage ckanPackage = getInstance(); + ckanPackage.setName(id); + String ret = ckanPackage.moderate(json); + ResponseBuilder responseBuilder = Response.status(Status.ACCEPTED); + if(ret!=null) { + responseBuilder.entity(ret).type(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8); + } + return responseBuilder.build(); } } diff --git a/src/main/java/org/gcube/gcat/social/PortalUser.java b/src/main/java/org/gcube/gcat/social/PortalUser.java index 3e00a30..dc50bcd 100644 --- a/src/main/java/org/gcube/gcat/social/PortalUser.java +++ b/src/main/java/org/gcube/gcat/social/PortalUser.java @@ -8,7 +8,7 @@ import java.util.List; import javax.ws.rs.InternalServerErrorException; import org.gcube.common.gxhttp.request.GXHTTPStringRequest; -import org.gcube.gcat.api.GCatConstants; +import org.gcube.gcat.api.moderation.Moderated; import org.gcube.gcat.utils.HTTPUtility; import org.gcube.com.fasterxml.jackson.databind.JsonNode; @@ -123,7 +123,7 @@ public class PortalUser { public boolean isCatalogueModerator() { if(catalogueModerator == null) { - catalogueModerator = getRoles().contains(GCatConstants.CATALOGUE_MODERATOR); + catalogueModerator = getRoles().contains(Moderated.CATALOGUE_MODERATOR); } return catalogueModerator; } diff --git a/src/main/java/org/gcube/gcat/utils/Constants.java b/src/main/java/org/gcube/gcat/utils/Constants.java index 80a81c1..b5902d2 100644 --- a/src/main/java/org/gcube/gcat/utils/Constants.java +++ b/src/main/java/org/gcube/gcat/utils/Constants.java @@ -76,7 +76,7 @@ public class Constants { } } - public static String getJWTAccessToken() throws Exception { + private static String getJWTAccessToken() throws Exception { String contextToAuthorise = SecretManager.instance.get().getContext(); TokenResponse tr = KeycloakClientFactory.newInstance().queryUMAToken(CLIENT_ID, getClientSecret(contextToAuthorise), contextToAuthorise, null); return tr.getAccessToken(); diff --git a/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java b/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java index 52ce38b..690f9ab 100644 --- a/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java +++ b/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java @@ -29,8 +29,9 @@ import org.gcube.common.resources.gcore.GenericResource; import org.gcube.common.resources.gcore.Resources; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.gcat.ContextTest; -import org.gcube.gcat.api.CMItemStatus; import org.gcube.gcat.api.GCatConstants; +import org.gcube.gcat.api.moderation.CMItemStatus; +import org.gcube.gcat.api.moderation.Moderated; import org.gcube.informationsystem.publisher.RegistryPublisher; import org.gcube.informationsystem.publisher.RegistryPublisherFactory; import org.junit.Assert; @@ -95,7 +96,7 @@ public class CKANPackageTest extends ContextTest { @Override public MultivaluedMap getQueryParameters() { MultivaluedMap mvm = new MultivaluedHashMap(); - mvm.add(GCatConstants.CM_ITEM_STATUS_QUERY_PARAMETER, CMItemStatus.PENDING.getValue()); + mvm.add(Moderated.CM_ITEM_STATUS_QUERY_PARAMETER, CMItemStatus.PENDING.getValue()); return mvm; }