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;
}