improving the zulip integration

This commit is contained in:
Luca Frosini 2021-11-18 17:49:24 +01:00
parent f00127a82a
commit bdbb954ba5
2 changed files with 74 additions and 18 deletions

View File

@ -13,6 +13,7 @@ import java.util.regex.Pattern;
import javax.ws.rs.BadRequestException; import javax.ws.rs.BadRequestException;
import javax.ws.rs.ForbiddenException; import javax.ws.rs.ForbiddenException;
import javax.ws.rs.InternalServerErrorException; import javax.ws.rs.InternalServerErrorException;
import javax.ws.rs.NotAllowedException;
import javax.ws.rs.WebApplicationException; import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status;
@ -647,6 +648,11 @@ public class CKANPackage extends CKAN {
return cmItemStatus; return cmItemStatus;
} }
protected boolean isItemCreator() {
return result.get(AUTHOR_EMAIL_KEY).asText().compareTo(ckanUser.getPortalUser().getEMail())==0;
}
@Override @Override
public String read() { public String read() {
try { try {
@ -664,7 +670,7 @@ public class CKANPackage extends CKAN {
PortalUser portalUser = ckanUser.getPortalUser(); PortalUser portalUser = ckanUser.getPortalUser();
if(result.get(AUTHOR_EMAIL_KEY).asText().compareTo(portalUser.getEMail())==0) { if(isItemCreator()) {
// The author is entitled to read its own items independently from the status // The author is entitled to read its own items independently from the status
return getAsString(result); return getAsString(result);
} }
@ -961,14 +967,18 @@ public class CKANPackage extends CKAN {
protected boolean isModerationEnabled() { protected boolean isModerationEnabled() {
boolean moderationEnabled = ckanInstance.isModerationEnabled(); boolean moderationEnabled = ckanInstance.isModerationEnabled();
if(moderationEnabled && zulipStream==null) { if(moderationEnabled && zulipStream==null) {
zulipStream = new ZulipStream("user@zulip.com", "apikey"); zulipStream = new ZulipStream();
} }
return moderationEnabled; return moderationEnabled;
} }
// private String getItemName() {
// String itemName = result.get(name).asText();
// return itemName;
// }
private void createNewStream() throws Exception { private void createNewStream() throws Exception {
String itemName = result.get(name).asText(); zulipStream.setItemCoordinates(itemID, name);
zulipStream.setItemCoordinates(itemID, itemName);
zulipStream.setCKANUser(ckanUser); zulipStream.setCKANUser(ckanUser);
zulipStream.create(); zulipStream.create();
} }
@ -1099,8 +1109,14 @@ public class CKANPackage extends CKAN {
result = mapper.readTree(ret); result = mapper.readTree(ret);
result = cleanResult(result); result = cleanResult(result);
return getAsString(result); ZulipStream zulipStream = new ZulipStream();
zulipStream.setItemCoordinates(itemID, name);
zulipStream.postItemCreatedToStream();
if(moderationMessage!=null && moderationMessage.compareTo("")!=0) {
zulipStream.postMessageToStream(CMItemStatus.PENDING, moderationMessage);
}
return getAsString(result);
} }
throw new MethodNotSupportedException("The approve operation is available only in moderation mode"); throw new MethodNotSupportedException("The approve operation is available only in moderation mode");
@ -1141,8 +1157,14 @@ public class CKANPackage extends CKAN {
result = mapper.readTree(ret); result = mapper.readTree(ret);
result = cleanResult(result); result = cleanResult(result);
return getAsString(result); ZulipStream zulipStream = new ZulipStream();
zulipStream.setItemCoordinates(itemID, name);
zulipStream.postItemRejectedToStream();
if(moderationMessage!=null && moderationMessage.compareTo("")!=0) {
zulipStream.postMessageToStream(CMItemStatus.REJECTED, moderationMessage);
}
return getAsString(result);
} }
throw new MethodNotSupportedException("The reject operation is available only in moderation mode"); throw new MethodNotSupportedException("The reject operation is available only in moderation mode");
@ -1157,7 +1179,26 @@ public class CKANPackage extends CKAN {
public void message() { public void message() {
try { try {
if(isModerationEnabled()) { if(isModerationEnabled()) {
// TODO if(moderationMessage==null || moderationMessage.compareTo("")==0) {
return;
}
read();
// Catalogue Moderators are allowed to post message to the dedicated Stream
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.");
}
}
ZulipStream zulipStream = new ZulipStream();
zulipStream.setItemCoordinates(itemID, name);
CMItemStatus cmItemStatus = getCMItemStatus();
zulipStream.postMessageToStream(cmItemStatus, moderationMessage);
} }
throw new MethodNotSupportedException("The message operation is available only in moderation mode"); throw new MethodNotSupportedException("The message operation is available only in moderation mode");
}catch(WebApplicationException e) { }catch(WebApplicationException e) {

View File

@ -9,6 +9,7 @@ import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; 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.ArrayNode;
import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
import org.gcube.gcat.api.CMItemStatus;
import org.gcube.gcat.persistence.ckan.CKANUser; import org.gcube.gcat.persistence.ckan.CKANUser;
import org.gcube.gcat.zulip.ZulipResponse.Result; import org.gcube.gcat.zulip.ZulipResponse.Result;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -27,6 +28,9 @@ public class ZulipStream {
private static final Logger logger = LoggerFactory.getLogger(ZulipStream.class); private static final Logger logger = LoggerFactory.getLogger(ZulipStream.class);
protected final ZulipRestExecutor gCatZulipRestExecutor;
protected ZulipRestExecutor userZulipRestExecutor;
protected String itemID; protected String itemID;
protected String itemName; protected String itemName;
@ -38,14 +42,23 @@ public class ZulipStream {
protected ObjectMapper objectMapper; protected ObjectMapper objectMapper;
protected ZulipRestExecutor zulipRestExecutor; public ZulipStream() {
// TODO Get gcat email and API key from configuration
public ZulipStream(String email, String password) { // TODO Get zulip URL from configuration
this.zulipRestExecutor = new ZulipRestExecutor(email, password,"https://zulip.example.com/"); this.gCatZulipRestExecutor = new ZulipRestExecutor("gcat@d4science.com", "apikey", "https://zulip.example.com/");
this.objectMapper = new ObjectMapper(); this.objectMapper = new ObjectMapper();
this.moderators = new HashSet<>(); this.moderators = new HashSet<>();
} }
public ZulipRestExecutor getUserZulipRestExecutor() {
if(userZulipRestExecutor==null) {
// TODO get API key ??
// TODO Get zulip URL from configuration
userZulipRestExecutor = new ZulipRestExecutor(ckanUser.getPortalUser().getEMail(), "apikey", "https://zulip.example.com/");
}
return userZulipRestExecutor;
}
public void setItemCoordinates(String itemID, String itemName) { public void setItemCoordinates(String itemID, String itemName) {
this.itemID = itemID; this.itemID = itemID;
this.itemName = itemName; this.itemName = itemName;
@ -77,7 +90,7 @@ public class ZulipStream {
} }
protected ZulipResponse executeZulipCall(ZulipRestAPICall call) throws Exception { protected ZulipResponse executeZulipCall(ZulipRestAPICall call) throws Exception {
String responseString = zulipRestExecutor.executeCall(call); String responseString = gCatZulipRestExecutor.executeCall(call);
ZulipResponse zulipResponse = new ZulipResponse(responseString); ZulipResponse zulipResponse = new ZulipResponse(responseString);
if(zulipResponse.getResponseResult()==Result.error) { if(zulipResponse.getResponseResult()==Result.error) {
throw new InternalServerErrorException(zulipResponse.getResponseMessage()); throw new InternalServerErrorException(zulipResponse.getResponseMessage());
@ -110,22 +123,24 @@ public class ZulipStream {
} }
private void postMessageToStream(String topic, String message) { protected void postMessageToStream(ZulipRestExecutor zulipRestExecutor, CMItemStatus cmItemStatus, String message) {
PostMessage postMessage = new PostMessage(getStreamName(), topic, message); PostMessage postMessage = new PostMessage(getStreamName(), cmItemStatus.getFancyValue(), message);
String response = zulipRestExecutor.executeCall(postMessage); String response = zulipRestExecutor.executeCall(postMessage);
logger.trace(response); logger.trace(response);
} }
public void postMessageToStream(CMItemStatus cmItemStatus, String message) {
postMessageToStream(getUserZulipRestExecutor(), cmItemStatus, message);
}
public void postItemCreatedToStream(){ public void postItemCreatedToStream(){
String message = ""; String message = "";
String topic = "Item Creation"; postMessageToStream(gCatZulipRestExecutor, CMItemStatus.PENDING, message);
postMessageToStream(topic, message);
} }
public void postItemRejectedToStream() { public void postItemRejectedToStream() {
String message = ""; String message = "";
String topic = "Item Rejected"; postMessageToStream(gCatZulipRestExecutor, CMItemStatus.REJECTED, message);
postMessageToStream(topic, message);
} }
} }