diff --git a/pom.xml b/pom.xml
index 2ba9857..afbfc8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -150,6 +150,11 @@
[1.0.0,2.0.0-SNAPSHOT)
+
+ io.taliox
+ zulip-java-rest
+ 1.0.0
+
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 a17b234..6ba6082 100644
--- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java
+++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java
@@ -31,6 +31,7 @@ import org.gcube.gcat.oldutils.Validator;
import org.gcube.gcat.profile.MetadataUtility;
import org.gcube.gcat.social.PortalUser;
import org.gcube.gcat.social.SocialPost;
+import org.gcube.gcat.social.ZulipStream;
import org.gcube.gcat.utils.URIResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -102,7 +103,6 @@ public class CKANPackage extends CKAN {
protected static final String SEARCHABLE_KEY = "searchable";
protected static final String CAPACITY_KEY = "capacity";
-
protected static final String CM_STATUS_QUERY_FILTER_KEY = "extras_systemcm_item_status";
protected static final String INCLUDE_PRIVATE_KEY = "include_private";
@@ -121,7 +121,8 @@ public class CKANPackage extends CKAN {
protected final Set supportedOrganizations;
protected String moderationMessage;
-
+ protected ZulipStream zulipStream;
+
public CKANPackage() {
super();
@@ -647,7 +648,11 @@ public class CKANPackage extends CKAN {
}
protected boolean isModerationEnabled() {
- return ckanInstance.isModerationEnabled();
+ boolean moderationEnabled = ckanInstance.isModerationEnabled();
+ if(moderationEnabled && zulipStream==null) {
+ zulipStream = new ZulipStream("user@zulip.com", "apikey");
+ }
+ return moderationEnabled;
}
@Override
@@ -755,6 +760,11 @@ public class CKANPackage extends CKAN {
sendSocialPost(title, catalogueItemURL);
}
+ if(isModerationEnabled()) {
+ createNewStream();
+ postItemCreatedToStream();
+ }
+
result = cleanResult(result);
return getAsString(result);
@@ -949,7 +959,22 @@ public class CKANPackage extends CKAN {
// super.purge();
}
- // Moderation Related functions
+ /*
+ * ----------------------------------------------------------------------------------------
+ * Moderation Related functions
+ * ----------------------------------------------------------------------------------------
+ *
+ */
+ private void createNewStream() {
+ String itemName = result.get(name).asText();
+ zulipStream.setItemCoordinates(itemID, itemName);
+ zulipStream.setCKANUser(ckanUser);
+ zulipStream.create();
+ }
+
+ private void postItemCreatedToStream() {
+ zulipStream.postItemCreatedToStream();
+ }
protected JsonNode checkModerationUpdate(JsonNode jsonNode) throws Exception{
PortalUser portalUser = ckanUser.getPortalUser();
@@ -1006,6 +1031,8 @@ public class CKANPackage extends CKAN {
protected void setToRejected(JsonNode jsonNode) {
addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.REJECTED.getValue());
+
+
}
diff --git a/src/main/java/org/gcube/gcat/social/ZulipStream.java b/src/main/java/org/gcube/gcat/social/ZulipStream.java
new file mode 100644
index 0000000..b815657
--- /dev/null
+++ b/src/main/java/org/gcube/gcat/social/ZulipStream.java
@@ -0,0 +1,108 @@
+package org.gcube.gcat.social;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
+import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode;
+import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
+import org.gcube.gcat.persistence.ckan.CKANUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.taliox.zulip.ZulipRestExecutor;
+import io.taliox.zulip.calls.messages.PostMessage;
+import io.taliox.zulip.calls.streams.PostCreateStream;
+
+/**
+ * @author Luca Frosini (ISTI - CNR)
+ */
+public class ZulipStream {
+
+ private static final Logger logger = LoggerFactory.getLogger(ZulipStream.class);
+
+ protected String itemID;
+ protected String itemName;
+
+ protected String streamName;
+ protected String streamDescription;
+
+ protected CKANUser ckanUser;
+ protected Set moderators;
+
+ protected ObjectMapper objectMapper;
+ protected ZulipRestExecutor zulipRestExecutor;
+
+ public ZulipStream(String email, String password) {
+ this.zulipRestExecutor = new ZulipRestExecutor(email, password,"https://zulip.example.com/");
+ this.objectMapper = new ObjectMapper();
+ this.moderators = new HashSet<>();
+ }
+
+ public void setItemCoordinates(String itemID, String itemName) {
+ this.itemID = itemID;
+ this.itemName = itemName;
+ }
+
+ public void setCKANUser(CKANUser ckanUser) {
+ this.ckanUser = ckanUser;
+ }
+
+ protected String getStreamName() {
+ if(streamName==null) {
+ streamName = String.format("Item '{}' with id '{}' moderation", itemName, itemID);
+ }
+ return streamName;
+ }
+
+ protected String getStreamDescription() {
+ if(streamDescription==null) {
+ streamDescription = String.format("This stream is used to discuss about the moderation of the item '{}' with id '{}'", itemName, itemID);
+ }
+ return streamDescription;
+ }
+
+ public void create() {
+ ArrayNode streamsArrayNode = objectMapper.createArrayNode();
+ ObjectNode streamobjectNode = objectMapper.createObjectNode();
+ streamobjectNode.put("name", getStreamName());
+ streamobjectNode.put("description", getStreamDescription());
+ streamsArrayNode.add(streamobjectNode);
+
+ ArrayNode principalsArrayNode = objectMapper.createArrayNode();
+ // Going to add the item creator
+ String itemCreatorEmail = ckanUser.getPortalUser().getEMail();
+ principalsArrayNode.add(itemCreatorEmail);
+ // Going to add the catalogue moderators
+ for(String moderator : moderators) {
+ principalsArrayNode.add(moderator);
+ }
+
+ PostCreateStream postCreateStream = new PostCreateStream(streamsArrayNode.toString());
+ postCreateStream.setPrincipals(principalsArrayNode.toString());
+ postCreateStream.setInvite_only(true);
+ postCreateStream.setAnnounce(false);
+
+ String response = zulipRestExecutor.executeCall(postCreateStream);
+ logger.trace(response);
+ }
+
+ private void postMessageToStream(String topic, String message) {
+ PostMessage postMessage = new PostMessage(getStreamName(), topic, message);
+ String response = zulipRestExecutor.executeCall(postMessage);
+ logger.trace(response);
+ }
+
+ public void postItemCreatedToStream(){
+ String message = "";
+ String topic = "Item Creation";
+ postMessageToStream(topic, message);
+ }
+
+ public void postItemRejectedToStream() {
+ String message = "";
+ String topic = "Item Rejected";
+ postMessageToStream(topic, message);
+ }
+
+}